/**
 * 防抖函数
 * 防抖是一种常用的优化函数执行频率的方法。
 * 当一个函数需要频繁地被调用时，防抖可以让该函数在一定时间内只执行一次，从而减少函数的执行次数。
 * 防抖函数会在函数被调用后，等待一段时间，如果在这段时间内函数没有被再次调用，那么该函数才会被执行。
 * 如果在等待时间内函数被再次调用，那么等待时间会重新计算。
 * 这种方法可以避免函数被频繁调用，从而提高程序的性能。
 * 
 * @param {Function} fn 需要防抖的函数
 * @param {Number} delay 防抖时间
 * @param {Boolean} immediate 是否立即执行
 * @returns {Function} 返回一个防抖函数
 */

function debounce(fn, delay = 500, immediate = false) {
    let timer;
    return function () {
        const args = arguments
        if (timer) {
            clearTimeout(timer)
        }
        if (immediate) {
            const callNow = !timer
            timer = setTimeout(() => {
                timer = null
            }, delay)
            if (callNow) {
                fn.apply(this, args)
            }
        } else {
            timer = setTimeout(() => {
                fn.apply(this, args)
            }, delay)
        }
    }
}
function test() {
  console.log('This is a test function');
}

const debouncedTest = debounce(test, 1000, true);

// This will immediately execute the debouncedTest function
debouncedTest();

// This will not execute the debouncedTest function immediately, but will wait for 1000ms before executing it
setTimeout(() => {
  debouncedTest();
}, 500);

// This will cancel the execution of the debouncedTest function
setTimeout(() => {
  clearTimeout(debouncedTest);
}, 1500);